
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Random;


public class ManagePartie {
	Partie partie;
	private LinkedList<Joueur> joueurs;
	int maxi_routes;
	Joueur first_max_route;
	
	public ManagePartie() {
		this.partie = new Partie();
		this.joueurs = new LinkedList<Joueur>();
		this.maxi_routes=0;
		this.first_max_route = new Joueur();
	}
	
	public ManagePartie(int nb_joueurs) {
		this();
		this.partie = new Partie();
		this.joueurs = new LinkedList<Joueur>();
		//System.out.println(tableau.length);
	}
	
	public ArrayList<Case> makeLesCases(int nb_joueurs){
		
		ArrayList<Case> plateau = new ArrayList<Case>();
		
		int totalCase = getNbCasesLignes(nb_joueurs) * getNbCasesLignes(nb_joueurs);
		
		for(int i=0; i<totalCase;i++)
		{
			Case c = new Case();
			plateau.add(c);
		}
		
		return plateau;
	}
	
	public ArrayList<Case> makeAleatoire(ArrayList<Case> plateau)
	{
		
		int taille = plateau.size();
		int num = 2;
		
		for(int i = 0; i<taille;i++)
		{
			plateau.get(i).setNumero(num);
			
			if(num == 12)
			num =2;
			else 
			num +=1;
//			System.out.print(plateau.get(i).get_numero()+"|");
		}
		
		//melange
		Collections.shuffle(plateau);
		
//		System.out.println("");
		
		int j = 0;
		ArrayList<String> res = new ArrayList<String>();
		res.add("Bois");
		res.add("Argile");
		res.add("Laine");
		res.add("Bl�s");
		res.add("Pierre");
		
		for(int i = 0; i<taille;i++)
		{
			plateau.get(i).setTypeRessource(res.get(j));
			
			if(j == 4)
			j = 0;
			
			else 
			j += 1;
//			System.out.print("|"+plateau.get(i).type_ressource()+plateau.get(i).get_numero());
		}
		
		//melange
		Collections.shuffle(plateau);
		
		for(int i = 0; i<taille;i++)
		{
			plateau.get(i).setNum_case(i);
			
//			System.out.print("|"+plateau.get(i).get_num_case());
		}
		return plateau;
	}
	
	
	public int getNbCasesLignes(int nb_joueurs){
		
		int nbCases = 10;
		if(nb_joueurs != 2 && nb_joueurs>2)
		{
			for(int i = 2;i<=nb_joueurs;i++)
			{
				nbCases += 2; 
			}
		}
		
		return nbCases;
	}

	
	public void add_joueur(Joueur joueur) {
		this.joueurs.add(joueur);
	}
	
	public boolean check_route(Case caseSource, Case caseTest) {
		return (caseSource.get_num_case() == caseTest.get_num_case() - 1) || (caseSource.get_num_case() == caseTest.get_num_case() + 1) || (caseSource.get_num_case() == caseTest.get_num_case() - this.partie.get_nb_cases_ligne()) || (caseSource.get_num_case() == caseTest.get_num_case() + this.partie.get_nb_cases_ligne());
	}
	
	public LinkedList<Integer> forbiden_cases_colonie(Case caseSource) {
		LinkedList<Integer> forbiden_cases;
		forbiden_cases = new LinkedList<Integer>();
		
		// Exclue les cases au dessus de la case passŽe en param�tre
		forbiden_cases.add(caseSource.get_num_case() - this.partie.get_nb_cases_ligne());
		forbiden_cases.add(caseSource.get_num_case() - (this.partie.get_nb_cases_ligne() * 2));
		
		// Exclue les cases ˆ droite de la case passŽe en param�tre
		forbiden_cases.add(caseSource.get_num_case() + caseSource.get_num_case() + 1);
		forbiden_cases.add(caseSource.get_num_case() + caseSource.get_num_case() + 2);
		
		// Exclue les cases en dessous de la case passŽe en param�tre
		forbiden_cases.add(caseSource.get_num_case() + this.partie.get_nb_cases_ligne());
		forbiden_cases.add(caseSource.get_num_case() + (this.partie.get_nb_cases_ligne() * 2));
		
		// Exclue les cases ˆ gauche de la case passŽe en param�tre
		forbiden_cases.add(caseSource.get_num_case() - caseSource.get_num_case() - 1);
		forbiden_cases.add(caseSource.get_num_case() - caseSource.get_num_case() - 2);
		
		return forbiden_cases;
	}
	
	public static void main(String args[])
	{
		ManagePartie m = new ManagePartie(3);
		
		//System.out.println(m.getNbCasesLignes(3)* m.getNbCasesLignes(3));
		
		ArrayList<Case> test = m.makeLesCases(2);
		m.makeAleatoire(test);

//		System.out.println(m.makeAleatoire(test,3));
		
		//System.out.println(test.size());
		
		//System.out.println(m->ManagePartie(3));
		
	}
	
	
	
	 public Joueur check_victoire(){
                int max_routes=0;
                int bonnus = 0;
                Joueur gagnant = null;
                Joueur winner_max_routes = null;
                
                for(Joueur joueur : this.joueurs ){
                        if(joueur.get_routes().size()>max_routes)
                        {
                                max_routes = joueur.get_routes().size();
                                winner_max_routes = joueur;
                        }
                }
                
                if(max_routes>this.maxi_routes)
                {
                        this.maxi_routes=max_routes;
                        this.first_max_route = winner_max_routes;
                }
                
       for(Joueur joueur : this.joueurs )
       {
        if (joueur == winner_max_routes){
                bonnus++;
        }
                if(joueur.get_points()+bonnus ==10)
                        gagnant=joueur; 
                }
                
                return gagnant;
    }
    

	public int lancer_des() {
                // Attention la valeur la plus haute est exclu (13 ext exclu)
                return (int) ((Math.random() * (13-2)) + 2);
    }
	
	
	public LinkedList<Joueur> get_joueurs() {
                return this.joueurs;
    }
        
	public Joueur get_joueur(int i) {
			return this.joueurs.get(i);
	}
	
}
